package com.yuro.easyfile;

import com.yuro.io.Files;
import com.yuro.lang.Dates;
import com.yuro.lang.Strings;
import org.nutz.filepool.FilePool;
import org.nutz.service.IdEntityService;

import java.io.File;
import java.util.ArrayList;
import java.util.List;


/**
 * 文件处理类
 * Created by leewell on 2017/3/26.
 */
public class FileService extends IdEntityService<FileEntity> {


    FilePool pool;


    /**
     * 保存文件，并将文件信息持久化到数据库
     *
     * @param src 源文件
     * @return FileEntity
     * @throws Exception
     */
    public FileEntity put(File src) throws Exception {
        return null == src ? null : serialize(src);
    }

    /**
     * 保存文件，并将文件信息持久化到数据库
     * @param src     源文件
     * @param originalName 文件名原始名称
     * @return
     * @throws Exception
     */
    public FileEntity put(File src, String originalName) throws Exception {
        return null == src ? null : serialize(src, originalName);
    }

    /**
     * 仅仅保存文件
     * @param f
     * @return
     */
    private long saveFile(File f) {
        File target = pool.createFile(Files.getSuffix(f));
        Files.copy(f, target);
        return pool.getFileId(target);
    }


    /**
     * 持久化文件信息
     *
     * @param src 源文件
     * @return
     */
    private FileEntity serialize(File src) throws Exception {
        long fid = this.saveFile(src);
        FileEntity meta = new FileEntity();
        meta.id = fid;
        meta.length = src.length();
        meta.originalName = Strings.isNull(meta.originalName) ? src.getName() : meta.originalName;
        meta.suffix = Files.getSuffix(src);
        meta.path = this.get(fid, meta.suffix).getAbsolutePath();
        meta.createTime = Dates.getFormateToday("yyyy-MM-dd HH:mm:ss");
        meta.type = Files.getFileType(src);
        return super._insert(meta);
    }

    /**
     * 持久化文件信息
     *
     * @param src 源文件
     * @return
     */
    private FileEntity serialize(File src, String originalName) throws Exception {
        long fid = this.saveFile(src);
        FileEntity meta = new FileEntity();
        meta.id = fid;
        meta.length = src.length();
        meta.originalName = Strings.isNull(originalName) ? src.getName() : originalName;
        meta.suffix = Files.getSuffix(src);
        meta.path = this.get(fid, meta.suffix).getAbsolutePath();
        meta.createTime = Dates.getFormateToday("yyyy-MM-dd HH:mm:ss");
        meta.type = Files.getFileType(src);
        return super._insert(meta);
    }


    /**
     * 获取单个文件
     *
     * @param id 文件id
     * @return
     */
    public File get(long id) {
        FileEntity f = super.fetch(id);
        return f != null ? pool.getFile(id, f.suffix) : null;
    }
    /**
     * 获取一组文件
     *
     * @param ids 文件id数组
     * @return
     */
    public List<File> get(long[] ids) {
        List<File> files = new ArrayList<File>();
        for (long id : ids) {
            FileEntity f = super.fetch(id);
            if(null != f){
                files.add(pool.getFile(id, f.suffix));
            }
        }
        return files;
    }

    /**
     * 获取文件，后缀不能为空
     * @param id 文件id
     * @return
     */
    private File get(long id, String suffix) {
        return pool.getFile(id, suffix);
    }

    /**
     * 删除一个文件
     * @param id
     * @return 0：文件未找到 否则返回删除记录数
     */
    public int remove(long id) {
        FileEntity f = super.fetch(id);
        if (f != null) {
            pool.removeFile(f.id, f.suffix);
            return super.delete(id);
        } else {
            return 0;
        }
    }
}
